package Offer46;

/**
 * @author 23737
 * @time 2021.9.13
 * 把数字翻译成字符串：
 * 给定一个数字，我们按照如下规则把它翻译为字符串：0 翻译成 “a” ，1 翻译成 “b”，……，11 翻译成 “l”，……，25 翻译成 “z”。
 * 一个数字可能有多个翻译。请编程实现一个函数，用来计算一个数字有多少种不同的翻译方法。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test {
    public static void main(String[] args) {
        int a = 25;
        System.out.println(new Solution().translateNum(12258));
        System.out.println(new SolutionTwice().translateNum(26));
    }
}

/*
第一眼看到这个题毫无头绪，百般思索之后去看了K大佬的题解
然后豁然开朗！！！
这是根据K大佬的题解自己写的解法
*/
class Solution {
    public int translateNum(int num) {
        String s = String.valueOf(num);
        int len = s.length();
        int a = 1, b = 1;
        //注意进行循环是从i=2开始的，因为后边要进行截取字符串的操作，而且截取的是前两个，所以要从二开始。
        for (int i = 2; i <= len; i++) {
            int c;
            String currentNumStr = s.substring(i - 2, i);
            //这里进行比较的时候也是很巧妙，用的是比较器来进行，如果是我我只能想到将字符串转为一个整数再进行比较
            /*
            按字典顺序比较两个字符串。 比较基于字符串中每个字符的 Unicode 值。
            此String对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。
            如果此String对象按字典顺序位于参数字符串之前，则结果为负整数。
            如果此String对象按字典顺序跟在参数字符串之后，则结果为正整数。
            如果字符串相等，则结果为零； 当equals(Object)方法返回true时， compareTo返回0
            */

            int number = Integer.parseInt(currentNumStr);
            if (number >= 10 && number < 26) {
                c = a + b;
            } else {
                c = a;
            }

            //第二种判断方法
//            boolean check = currentNumStr.compareTo("10") >= 0 && currentNumStr.compareTo("26")<=0;
//            if (check) {
//                //这里和后边的a,b,c赋值操作，自己动手试试就知道了
//                c = a+b;
//            }else {
//                c = a;
//            }

            b = a;
            a = c;
        }
        return a;
    }
}

/**
 * 动态规划解题
 */
class SolutionTwice {
    public int translateNum(int num) {
        String s = String.valueOf(num);
        int p = 1, q = 1;
        for (int i = 2; i <= s.length(); i++) {
            int c;
            String substring = s.substring(i - 2, i);
            if (substring.compareTo("10") >= 0 && substring.compareTo("25") <= 0) {
                c = p + q;
            } else {
                c = q;
            }
            p = q;
            q = c;
        }
        return q;
    }
}
